iT邦幫忙

2021 iThome 鐵人賽

DAY 1
1

在上一篇內容中提到一個伺服器需要以怎麼樣的規格跟方式來跟用戶溝通,來讓他們找尋/新增他們需要的服務,但接下來的問題是,那我們該把用戶需要的資料放到哪裡呢?

這時候資料庫就派得上用場了

在現在比較常見的資料庫分成sql/nosql/new sql,有興趣的話可以到網路上找找相關的資源,在這邊我會以sql當作這次的主要描述對象

資料庫是什麼

資料庫就是可以方便讓使用者透過規範好的語法,來讓你更有效率的讀取,寫入,更新,刪除,計算的系統

而sql最大的特點就在,他可以將資料化成一個表格,每張表格就叫一張table,而這些table會放在一個叫做database裏面,而在每個table中會有一個一個的屬性和名稱(一個屬性加名稱就是一個欄位),而這些欄位都要預先決定好,可以來分別儲存相對應的資料

接下來的內容會有舉例,而以下用postgresql作為舉例的sql類型

接著如果需要將資料做變更,就會需要下列幾種語法

  • 建立table
    CREATE TABLE <table名稱> (
    屬性名稱 屬性類別 其他屬性
    );

這個屬性類別有很多種,在他的文件內都會有說明
而這邊舉幾個比較常見的

  • 文字 => varchar text
  • 整數 => integer
  • 浮點數(有小數點的數字) => float8
  • 布林值(是或否) => boolean

舉例

CREATE TABLE public.people (
	id_number varchar NOT NULL,
	"name" varchar NOT NULL,
    age integer NOT NULL,
	gender varchar NOT NULL,
	CONSTRAINT people_pk PRIMARY KEY (id_number)
);

至於最後的
CONSTRAINT people_pk PRIMARY KEY (id_number)
是在幫這張表建立主鍵,就是這張表的這個欄位他是一個唯一的識別碼,這樣可以在未來在找相對應的紀錄時,可以找的比較快(可以想成有寫郵遞區號的信件就可以比較容易知道要寄到哪裡)

  • 讀取

select <需要哪些欄位> from <某張table> (where <需要的條件>) (order by <需要的欄位> desc/asc) (limit <需要輸出的數量>) (offset <跳過的數量>);

舉例

SELECT name, gender FROM people;

將people這張table中的name跟gender印出來

SELECT * FROM eople;

*代表全部的意思,就會是將people中的所有欄位都印出來

將people取出叫John的人

SELECT * FROM people WHERE "name" = 'John';

將people取出來的資料由小到大排序

SELECT * FROM people ORDER BY age ASC;

將people取出來的資料由大到小排序

SELECT * FROM people ORDER BY age DESC;

將people中年紀前10小的人找出來

SELECT * FROM people ORDER BY age ASC LIMIT 10;

將people中年紀11~20小的人找出來

SELECT * FROM people ORDER BY age ASC offset 10 LIMIT 10;
  • 更新
    UPDATE <某張table> SET <目標欄位>=<目標值> WHERE <需要的條件>

舉例

UPDATE public.people
	SET "name"='Judy'
	WHERE id_number='K213654789';
  • 刪除
    DELETE FROM <某張table> (where <需要的條件>)
DELETE FROM public.people
	WHERE id_number='113b4445-c763-4bd3-b42a-f3accf32b089';

補充說明
在postgresql中,""代表的是欄位名稱,''代表的是字串內容,不要搞混嘍
在sql語法中,大小寫其實沒有關係,但在呈現上,如果sql相關的指令用大寫寫下來會比較好閱讀的

範例說明

假如我們現在要做一個紀錄家人體溫的服務

那我們會需要開一張表來存這些紀錄
先暫時取名叫做record

那他會需要以下欄位

  • 流水號(id) => string
  • 姓名(name) => string
  • 日期(date) => time
  • 溫度(temperature) => double(因為會有小數點)

另外,我們在裡面新增兩筆紀錄
https://extendsclass.com/postgresql/0f8a348

CREATE TABLE public.records (
	id uuid NOT NULL,
	"name" varchar NULL,
	"date" timestamptz NULL,
	temperature float8 NULL,
	CONSTRAINT record_pk PRIMARY KEY (id)
);
INSERT INTO public.records (id,"name","date",temperature) VALUES
	 ('66a9c0e2-96ce-4622-8da4-e9b1987ba2ac'::uuid,'Peter','2021-08-31 20:05:53.539295+08',"36.3,36.3"),
	 ('2507a051-155d-432b-a92e-bb5bee2bb41b'::uuid,'Kevin','2021-08-31 20:05:18.171572+08',36.1);
     
select * from records;

這時,有個需求,需要紀錄家人的身分證字號,也要紀錄家人的性別,因此需要再開兩個欄位

  • 身分證字號(id_number)
  • 性別(gender)

https://extendsclass.com/postgresql/418ae69

但日後如果紀錄幾天的內容,讓資料如下
https://extendsclass.com/postgresql/b021a87

那這樣如果有一天,Peter想要改名成John
那就會需要將所有id_number為A123456789的資料改成John,這樣會一次異動到50%的資料,會對資料庫造成相對大的負擔,因此在這個時候就會透過一個小技巧來讓資料儲存的更有效率


上一篇
介紹RESTful api(Day9)
下一篇
資料庫正規化說明(Day11)
系列文
網頁新手入門,手把手用React/Golang(Echo)開發基礎網頁(以簡易智慧家庭為例)28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言